package org.domain.projeto.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.Date;
import java.util.Map;
import java.util.Properties;
import java.util.Random;

public class Utilitario {

	static final String caracteresCodigo = "1234567890ABCDEFGHIJKLMNOPQRSTUVXWYZ";
	static final String caracteresCodigoNumerico = "1234567890";

	public static String geraCodigo(int tamanhoCodigo){
		Random geradorAleatorio = new Random();
		int indiceAleatorio;
		StringBuffer bufferCodigo = new StringBuffer();
		for(int i = 0; i < tamanhoCodigo; i++) {
			indiceAleatorio = geradorAleatorio.nextInt(caracteresCodigo.length());
			bufferCodigo.append(caracteresCodigo.charAt(indiceAleatorio));
		}
		return bufferCodigo.toString();
	}

	public static String geraCodigoNumerico(int tamanhoCodigo){
		Random geradorAleatorio = new Random();
		int indiceAleatorio;
		StringBuffer bufferCodigo = new StringBuffer();
		for(int i = 0; i < tamanhoCodigo; i++) {
			indiceAleatorio = geradorAleatorio.nextInt(caracteresCodigoNumerico.length());
			bufferCodigo.append(caracteresCodigoNumerico.charAt(indiceAleatorio));
		}
		return bufferCodigo.toString();
	}

	public static String getResourceProperty(Object clazz,String nomeArquivoResource,String propriedade){
		Properties props = new Properties();
		String resource = nomeArquivoResource;
		InputStream stream = clazz.getClass().getClassLoader().getResourceAsStream(resource);
		try {
			props.load(stream);
			return props.getProperty(propriedade);
		} catch (IOException ex) {
			ex.printStackTrace();
		} finally {
			try {
				stream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return null;
	}

	public static double diferencaEmHoras(Date dataInicial,Date dataFinal){
		long diferenca = dataFinal.getTime()
				- dataInicial.getTime();
		double diferencaEmDias = (diferenca / 1000) / 60 / 60 / 24;
		long horasRestantes = (diferenca / 1000) / 60 / 60 % 24;
		return (diferencaEmDias * 24)
				+ horasRestantes;
	}

	public static double diferencaEmMinutos(Date dataInicial,Date dataFinal){
		long diferenca = dataFinal.getTime()
				- dataInicial.getTime();
		double diferencaEmMinutos = (diferenca / 1000) / 60;
		return diferencaEmMinutos;
	}

	public static String getResourceProperty(String nomeArquivoResource,String propriedade){
		Properties props = new Properties();
		try {
			props.load(new FileInputStream(new File(nomeArquivoResource)));
			return props.getProperty(propriedade);
		} catch (IOException ex) {
			ex.printStackTrace();
		}
		return null;
	}

	public static boolean isVazio(String valor){
		return valor == null
				|| (valor.trim()).length() == 0;
	}

	public static boolean isVazio(Object [] obj){
		return obj == null
				|| obj.length == 0;
	}

	public static boolean isVazio(Object obj){
		return obj == null;
	}

	public static boolean isVazio(char valor){
		Character character = new Character(valor);
		return isVazio(character.toString());
	}

	public static boolean isVazio(Collection<?> lista){
		return lista == null
				|| lista.isEmpty();
	}

	public static boolean isVazio(Map<?,?> mapa){
		return mapa == null
				|| mapa.isEmpty();
	}
}
